home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / C / SZDD.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-16  |  2.5 KB  |  83 lines

  1. /* XFD external slave for SZDD format by Kyzer/CSG <kyzer@4u.net>
  2.  * This is no longer supported -- see the assembler XFD slave,
  3.  * or the portable C szddexpand.c (or the Linux mscompress package)
  4.  */
  5.  
  6. #include <libraries/xfdmaster.h>
  7. #include <proto/exec.h>
  8. #include <exec/memory.h>
  9. #include "SDI_compiler.h"
  10.  
  11. #define SZDD_OVERRUN  (144)    /* 8 matches, at maximum length */
  12. #define SZDD_MINLEN   (14)     /* 4+4+2+4 = 14 byte header (and 0 data) */
  13. #define SZDD_WNDSIZE  (4096)   /* LZ sliding window size (4k) */
  14.  
  15. static char version[]="$VER: SZDD 1.3 (29.06.2000) by <kyzer@4u.net>";
  16.  
  17.  
  18. ASM(BOOL) SZDD_recog(REG(a0, STRPTR buf), REG(d0, ULONG length)
  19.   REG(a1, struct xfdRecogResult *rr)) {
  20.   if (buf[0]=='S' && buf[1]=='Z' && buf[2] =='D' && buf[3]=='D') {
  21.     rr->xfdrr_MinTargetLen = SZDD_OVERRUN + (
  22.       rr->xfdrr_FinalTargetLen =
  23.       buf[10] | (buf[11]<<8) | (buf[12]<<16) | (buf[13]<<24)
  24.     );
  25.     return (BOOL) 1;
  26.   }
  27.   return (BOOL) 0;
  28. }
  29.  
  30. ASM(BOOL) SZDD_decrunch(REG(a0, struct xfdBufferInfo * xbi),
  31.   REG(a6, struct xfdMasterBase *xfdMasterBase)) {
  32.  
  33.   struct ExecBase *SysBase = xfdMasterBase->xfdm_ExecBase;
  34.  
  35.   UBYTE *rep, mask, bits;
  36.   int offset, length, clrlen;
  37.  
  38.   UBYTE *src  = (UBYTE *) xbi->xfdbi_SourceBuffer + 14;
  39.   UBYTE *dest = (UBYTE *) xbi->xfdbi_UserTargetBuf;
  40.   UBYTE *ends = src  + xbi->xfdbi_SourceBufLen;
  41.   UBYTE *endd = dest + xbi->xfdbi_TargetBufSaveLen;
  42.   UBYTE *base = dest;
  43.   int posn = SZDD_WNDSIZE-16;
  44.  
  45.   while (src < ends) {
  46.     bits = *src++;
  47.     for (mask = 0x01; mask & 0xFF; mask <<= 1) {
  48.       if (bits & mask) posn++, *dest++ = *src++;
  49.       else {
  50.         offset  = *src++; length = *src++;
  51.         offset |= (length << 4) & 0xF00;
  52.         length  = (length & 0x0F) + 3;
  53.  
  54.         /* translate absolute 4k buffer offset into real window offset */
  55.         posn &= SZDD_WNDSIZE-1; if (offset > posn) posn += SZDD_WNDSIZE;
  56.         rep = dest - posn + offset;
  57.         posn += length;
  58.  
  59.         /* if repeat starts before actual data, write spaces */
  60.         while (rep < base && length-- > 0) rep++, *dest++ = ' ';
  61.  
  62.         /* copy out repeat */
  63.         while (length-- > 0) *dest++ = *rep++;
  64.       }
  65.  
  66.     }
  67.  
  68.     /* at worst, we could overrun dest by (15+3)*8 = 144 bytes */
  69.     if (dest >= endd) return 1;
  70.   }
  71.  
  72.   /* bad exit - run out of src */
  73.   xbi->xfdbi_Error = XFDERR_CORRUPTEDDATA;
  74.   return 0;
  75. }
  76.  
  77. struct xfdSlave FirstSlave = {
  78.   NULL, XFDS_VERSION, 39, "(SZDD) Microsoft Data Cruncher",
  79.   XFDPFF_DATA|XFDPFF_RECOGLEN|XFDPFF_USERTARGET,
  80.   0, (BOOL (*)()) SZDD_recog, (BOOL (*)()) SZDD_decrunch,
  81.   NULL, NULL, 0, 0, SZDD_MINLEN
  82. };
  83.